import type { ResPage } from "@/api/interface";

/**
 * 分页数据解析工具
 * 处理不同后端返回的分页数据格式
 */
export class PageHelper {
  /**
   * 解析分页响应数据
   * @param response 后端返回的分页数据
   * @returns 标准化的分页数据
   */
  static parsePage<T>(response: any): ResPage<T> {
    // 如果已经是标准格式，直接返回
    if (response.records && response.total !== undefined) {
      return {
        records: response.records || [],
        current: Number(response.current) || 1,
        size: Number(response.size) || 10,
        total: Number(response.total) || 0,
        pages: Number(response.pages)
      };
    }

    // 兼容其他可能的格式
    if (response.list) {
      return {
        records: response.list || [],
        current: Number(response.pageNum || response.current) || 1,
        size: Number(response.pageSize || response.size) || 10,
        total: Number(response.total) || 0,
        pages: Number(response.pages)
      };
    }

    // 如果是数组格式（无分页）
    if (Array.isArray(response)) {
      return {
        records: response,
        current: 1,
        size: response.length,
        total: response.length,
        pages: 1
      };
    }

    // 默认返回空数据
    console.warn('无法解析分页数据格式:', response);
    return {
      records: [],
      current: 1,
      size: 10,
      total: 0,
      pages: 0
    };
  }

  /**
   * 安全获取分页数据列表
   * @param response 后端返回的分页数据
   * @returns 数据列表
   */
  static getRecords<T>(response: any): T[] {
    const pageData = this.parsePage<T>(response);
    return pageData.records;
  }

  /**
   * 安全获取总数
   * @param response 后端返回的分页数据
   * @returns 总数
   */
  static getTotal(response: any): number {
    const pageData = this.parsePage(response);
    return pageData.total;
  }

  /**
   * 创建分页请求参数
   * @param current 当前页
   * @param size 页面大小
   * @param extraParams 额外参数
   * @returns 分页请求参数
   */
  static createPageParams(current: number, size: number, extraParams: Record<string, any> = {}) {
    return {
      current,
      size,
      ...extraParams
    };
  }
}

/**
 * 分页数据处理装饰器
 * 用于自动处理API返回的分页数据
 */
export function withPageParsing<T extends (...args: any[]) => Promise<any>>(
  apiFunction: T
): T {
  return (async (...args: any[]) => {
    const result = await apiFunction(...args);
    if (result?.data) {
      result.data = PageHelper.parsePage(result.data);
    }
    return result;
  }) as T;
}